home *** CD-ROM | disk | FTP | other *** search
/ Delphi Magazine Collection 2001 / Delphi Magazine Collection 20001 (2001).iso / DISKS / Issue38 / Parser / parsecmp.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1998-07-05  |  2.9 KB  |  107 lines

  1. { *****************************************************
  2.                 ThgsParser Component
  3.  
  4.   ThgsParser encapsulates the TCustomParser class and
  5.   provides flexible, reusable parsing through a component.
  6.  
  7.                     Paul Warren
  8.            HomeGrown Software Development
  9.          (c) 1998 Langley British Columbia.
  10.                   (604) 856-6523
  11.            e-mail:  hg_soft@uniserve.com
  12.      Home page: http://users.uniserve.com/~hg_soft
  13.   ***************************************************** }
  14.  
  15. unit Parsecmp;
  16.  
  17. interface
  18.  
  19. uses
  20.   SysUtils, WinTypes, WinProcs, Messages, Classes, Controls,
  21.   NewParse;
  22.  
  23. type
  24.   TParserType = (ptCSV, ptText, ptPascal, ptEnhPas, ptHtml);
  25.   TOnParseEvent = procedure(Sender: TObject; Token: char; var Abort: boolean) of object;
  26.  
  27.   ThgsParser = class(TComponent)
  28.   private
  29.     { private declarations }
  30.     ParserRef: TParserClass;
  31.     FParser: TCustomParser;
  32.     FParserType: TParserType;
  33.     FParseStream: TStream;
  34.     FOnParse: TOnParseEvent;
  35.     procedure SetParseStream(Value: TStream);
  36.     procedure SetOnParse(Value: TOnParseEvent);
  37.   protected
  38.     { protected declarations }
  39.   public
  40.     { public declarations }
  41.     constructor Create(AOwner: TComponent); override;
  42.     property ParseStream: TStream write SetParseStream;
  43.   published
  44.     { published declarations }
  45.     property ParserType: TParserType read FParserType write FParserType default ptHtml;
  46.     property OnParse: TOnParseEvent read FOnParse write SetOnParse;
  47.   end;
  48.  
  49. procedure Register;
  50.  
  51. implementation
  52.  
  53. {$IFDEF WIN32}
  54.   {$R PARSECMP.D32}
  55. {$ELSE}
  56.   {$R PARSECMP.D16}
  57. {$ENDIF}
  58.  
  59. constructor ThgsParser.Create(AOwner: TComponent);
  60. begin
  61.   inherited Create(AOwner);
  62.   FParserType := ptHtml;
  63. end;
  64.  
  65. procedure ThgsParser.SetParseStream(Value: TStream);
  66. var
  67.   Abort: boolean;
  68. begin
  69.   Abort := false;
  70.   FParseStream := Value; { assign stream - note must be freed by caller }
  71.   case FParserType of { check the parser type }
  72.     { set class reference according to parser type }
  73.     ptCSV: ParserRef := TParserClass(TCSVParser);
  74.     ptText: ParserRef := TParserClass(TTextParser);
  75.     ptPascal: ParserRef := TParserClass(TPasParser);
  76.     ptEnhPas: ParserRef := TParserClass(TEnhPasParser);
  77.     ptHtml: ParserRef := TParserClass(THtmlParser);
  78.   end;
  79.   { create parser instance }
  80.   FParser := ParserRef.Create(FParseStream);
  81.   if Assigned(FOnParse) then FOnParse(FParser, FParser.Token, Abort);
  82.   if Abort then Exit;
  83.   try
  84.     { parse file }
  85.     while FParser.Token <> toEOF do
  86.     begin
  87.       FParser.NextToken;
  88.       if Assigned(FOnParse) then FOnParse(FParser, FParser.Token, Abort);
  89.       if Abort then Break;
  90.     end;
  91.   finally
  92.     FParser.Free; { free parser }
  93.   end;
  94. end;
  95.  
  96. procedure ThgsParser.SetOnParse(Value: TOnParseEvent);
  97. begin
  98.   FOnParse := Value;
  99. end;
  100.  
  101. { register component on HomeGrown page }
  102. procedure Register;
  103. begin
  104.   RegisterComponents('HomeGrown', [ThgsParser]);
  105. end;
  106.  
  107. end.